#ifndef __TCP_SERVER_H__
#define __TCP_SERVER_H__
#include "NonCopyable.h"

#include "Acceptor.h"
#include "EventLoop.h"
#include <map>

using std::map;

// 处理TCP新连接 连接建立 后会创建一个TcpConnection对象
class TcpConnection;
class  TcpServer : NonCopyable
{
public:
    typedef std::function<void(EventLoop *)> ThreadInitCallback;
    typedef std::shared_ptr<TcpConnection> TcpConnectionPtr;

    TcpServer(EventLoop *loop, const InetAddress &listenAddr);
    ~TcpServer();

private:
    struct sockaddr_in getLocalAddr(int sockfd);
    struct sockaddr_in getPeerAddr(int sockfd);

    void newConnection(int sockfd, const InetAddress &peerAddr);
    void removeConnection(const TcpConnectionPtr &conn);
    typedef std::function<void(int sockfd, const InetAddress&)> NewConnectionCallback;
    typedef std::function<void(const TcpConnectionPtr &)> ConnectionCallback;
    typedef std::function<void(const TcpConnectionPtr &, 
        // const string &)> MessageCallback;
        Buffer *, Timestamp)> MessageCallback;
    typedef map<string, TcpConnectionPtr> ConnectionMap;

    EventLoop *_loop;   // 事件循环
    const string _name; // 服务器名称
    unique_ptr<Acceptor> _acceptor; // 监听新连接
    ConnectionCallback _connectionCallback; // 新连接回调
    MessageCallback _messageCallback; // 消息回调
    bool _started; // 是否已启动
    int _nextConnId; // 下一个连接ID
    ConnectionMap _connections; // 连接列表
};

#endif